package projet.bd;

import java.security.Timestamp;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import event.Event;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.text.format.DateFormat;
import android.widget.TextView;
import android.widget.Toast;

public class SmsListener extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		// ---get the SMS message passed in---
		Bundle bundle = intent.getExtras();
		SmsMessage[] msgs = null;
		String str = "";
		String auteur_message = new String();
		String corps_message = new String();
		String date_message = new String();
		String source = new String();
		
		
		if (bundle != null) {			
			
			// ---retrieve the SMS message received---
			Object[] pdus = (Object[]) bundle.get("pdus");
			msgs = new SmsMessage[pdus.length];

			for (int i = 0; i < msgs.length; i++) {

				// Création d'un SMS à partir du format PDU d'android
				msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
				// Récupération des informations utiles (auteur, corps du
				// message et la date de reception)
				auteur_message = msgs[i].getOriginatingAddress();
				corps_message = msgs[i].getMessageBody().toString();
				// Creation de la date de reception
				SimpleDateFormat nouveauDateFormat = new SimpleDateFormat(
						"dd/MM/yyyy HH:mm:ss");
				Date date = new Date(msgs[i].getTimestampMillis());
				date_message = nouveauDateFormat.format(date);
				source = "SMS";

			}
			
			corps_message = corps_message.toLowerCase();
			
			// Vérifie que le corps du message contient au moins un événement
			// (expression du type [..]<event>[..]</event>[..]
			// A chaque vérification, on vérifie que le "document" XML est bien formé, 
			// c'est é dire que les balises ne sont pas encastrées les unes dans les autres
			if (corps_message.contains("<event>")
					&& corps_message.contains("</event>")
					&& corps_message.indexOf("</event>") > corps_message.indexOf("<event>")) {
				int nbEvt = 0;

				// Traitement de tous les événements contenus dans le message
				while (corps_message.indexOf("<event>") != -1) {
					String type = new String(), description = new String(), lieu = new String();
					// Un événement doit au moins contenir un type :
					// La description et le lieu sont optionnels
					if (corps_message.contains("<type>")
							&& corps_message.contains("</type>")
							&& corps_message.indexOf("</type>") > corps_message.indexOf("<type>")
							&& corps_message.indexOf("<type>") > corps_message.indexOf("<event>")
							&& corps_message.indexOf("</type>") < corps_message.indexOf("</event>")
							&& corps_message.subSequence(corps_message.indexOf("<type>")+6, corps_message.indexOf("</type>")).length() != 0
							&& !((String) corps_message.subSequence(corps_message.indexOf("<type>")+6, corps_message.indexOf("</type>"))).contains("<")
							)
					{
						type = (String) corps_message.subSequence(corps_message.indexOf("<type>")+6, corps_message.indexOf("</type>"));
						
						// Détermination de la description, si elle existe
						if (corps_message.contains("<description>")
								&& corps_message.contains("</description>")
								&& corps_message.indexOf("</description>") > corps_message.indexOf("<description>")
								&& corps_message.indexOf("<description>") > corps_message.indexOf("<event>")
								&& corps_message.indexOf("</description>") < corps_message.indexOf("</event>")
								&& corps_message.subSequence(corps_message.indexOf("<description>")+13, corps_message.indexOf("</description>")).length() != 0
								&& !((String) corps_message.subSequence(corps_message.indexOf("<description>")+13, corps_message.indexOf("</description>"))).contains("<")
								)
								description = (String) corps_message.subSequence(corps_message.indexOf("<description>")+13, corps_message.indexOf("</description>"));
						// Détermination du lieu, s'il existe
						if (corps_message.contains("<lieu>")
								&& corps_message.contains("</lieu>")
								&& corps_message.indexOf("</lieu>") > corps_message.indexOf("<lieu>")
								&& corps_message.indexOf("<lieu>") > corps_message.indexOf("<event>")
								&& corps_message.indexOf("</lieu>") < corps_message.indexOf("</event>")
								&& corps_message.subSequence(corps_message.indexOf("<lieu>")+5, corps_message.indexOf("</lieu>")).length() != 0
								&& !((String) corps_message.subSequence(corps_message.indexOf("<lieu>")+6, corps_message.indexOf("</lieu>"))).contains("<")
								)
								lieu = (String) corps_message.subSequence(corps_message.indexOf("<lieu>")+6, corps_message.indexOf("</lieu>"));
							
						// Constitution de la chaine du toast
						String descr = new String();
						descr += "Source : " + source + "\n";
						descr += "Type : " + type;
						descr += "\nAuteur : " + auteur_message;
						if (description.length() != 0)
							descr += "\nDescription : " + description;
						descr += "\nDate de naissance : " + date_message;
						if (lieu.length() != 0)
							descr += "\nLieu : " + lieu;			
						
						
						
						//Toast.makeText(context, descr, Toast.LENGTH_SHORT).show();
						nbEvt++;
						descr +="\n";
						
						//Appel de la nouvelle activité (sauvegarde du message dans un fichier)
						Intent i = new Intent(context,SmsStockageActivity.class);
						i.addFlags(Intent.FLAG_FROM_BACKGROUND);
						i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
						i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
						i.putExtra("type", "insertion");						
						i.putExtra("val", descr);
						Toast.makeText(context, "Un sms a été reçu", Toast.LENGTH_SHORT).show();
						context.startActivity(i);			
						
					}
					// élimination du premier événement dans le message
					corps_message = corps_message.substring(corps_message
							.indexOf("</event>") + 7);
				}
				
				// Si un événement a été trouvé : pas de transmission du message
				// au reste
				// des applications.
				// Sinon, récupération qui n'avait pas lieu d'étre
				if (nbEvt > 0)
					abortBroadcast();
			}
		}
	}
	
	
}